package interfaz;

import interfaz.ComprasInterfaz.tableEmergente;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.DriverManager;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import javax.swing.text.MaskFormatter;
import javax.swing.text.TabExpander;
import javax.transaction.Transaction;
import java.text.SimpleDateFormat;

import org.apache.commons.beanutils.converters.DateConverter;
import org.freixas.jcalendar.DateEvent;
import org.freixas.jcalendar.DateListener;
import org.freixas.jcalendar.JCalendar;
import org.hibernate.Session;
import org.hibernate.type.descriptor.java.JdbcDateTypeDescriptor;

import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;

import dao.ClientesDAOImpl;
import dao.EmpleadosDAOImpl;
import dao.LineaCompraDAOImpl;
import dao.utils.HibernateUtil;
import domain.Clientes;
import domain.Empleados;
import domain.LineaCompra;

public class ClientesInterfaz extends JFrame implements ActionListener,
		KeyListener, MouseListener {

	private static final long serialVersionUID = 1L;

	private Login login;
	private int fila;

	private JPanel panelPrincipal;

	String[] elementosCombo = { "No", "Sí" };
	JComboBox comboBox = new JComboBox(elementosCombo);

	// Botn del panel Izquierdo
	private JButton btnCambioUsuario = new JButton("Cambio de usuario",
			new ImageIcon("images/people.png"));

	private boolean esAdministrador;

	// Paneles
	private JPanel panelCentral;
	private JPanel panelIzquierdo;

	// Cuadros de texto del panel central

	private JTextField txtDni = new JTextField();
	private JTextField txtNombre = new JTextField();
	private JTextField txtApellidos = new JTextField();
	private JPasswordField txtPasswd = new JPasswordField();
	private JTextField txtMail = new JTextField();
	private JTextField txtTlf = new JTextField();
	private JTextField txtCalle = new JTextField();
	private JComboBox txtPagado = new JComboBox();
	private JTextField txtnumCuenta = new JTextField();
	private JTextField txtNacimiento = new JTextField();
	private JComboBox txtSexo = new JComboBox();
	private JComboBox txtSocio = new JComboBox();

	private JLabel lbMensajes = new JLabel(""); // Muestra mensajes por pantalla

	private JLabel lbDni = new JLabel("Dni (*)");
	private JLabel lbDni_ = new JLabel("Dni");
	private JLabel lbNombre = new JLabel("Nombre (*)");
	private JLabel lbNombre_ = new JLabel("Nombre");
	private JLabel lbApellidos = new JLabel("Apellidos (*)");
	private JLabel lbApellidos_ = new JLabel("Apellidos");
	private JLabel lbSocio = new JLabel("Socio (*)");
	private JLabel lbpasswd = new JLabel("Passwd (*)");
	private JLabel lbMail = new JLabel("Email");
	private JLabel lbTlf = new JLabel("Telefono (*)");
	private JLabel lbTlf_ = new JLabel("Telefono");
	private JLabel lbCalle = new JLabel("Direccion (*)");
	private JLabel lbPagado = new JLabel("Pagado (*)");
	private JLabel lbnumCuenta = new JLabel("numCuenta (*)");
	private JLabel lbNacimiento = new JLabel("Nacimiento (*)");
	private JLabel lbSexo = new JLabel("Sexo (*)");
	private JLabel lbEsAdministrador = new JLabel("Administrador (*)");

	private JButton btnAlta = new JButton("Guardar");
	private JButton btnBaja = new JButton("Baja");
	private JButton btnModif = new JButton("Modificar");
	private JButton btnLimpiar = new JButton("Limpiar");
	private JButton btnGuardar = new JButton("Guardar");
	private JButton btnReset = new JButton("Reset");
	private JButton btnFecha = new JButton("Selecciona Fecha");

	private JScrollPane scrollPanel = null;
	private JTable table = null;
	private TableRowSorter<ModeloTabla> elQueOrdena;

	private JLabel lbGestionClientes;
	private JLabel lbAltaClientes;
	private JCalendar calendario;

	private ModeloTabla modelo;
	private ArrayList<Clientes> dniDel = new ArrayList<Clientes>();
	private Clientes cliente = new Clientes();
	private ArrayList<Clientes> dniDel2 = new ArrayList<Clientes>();

	private boolean esSocio;
	private boolean pagado;
	private boolean sexo;
	private String dni;
	private String nombre;
	private String apellido;
	private String passwd;
	private String mail;
	private String tlf;
	private String calle;
	private String numcuenta;
	private String nacimiento;
	private boolean util;
	
	/**
	 * Es el constructor que borra toda la interfaz y la construye, además implemente los escuchadores 
	 * @param pCentral: es aquel que muestra los formularios, tablas... 
	 * @param pIzquierdo: es aquel que muestra el menú con los distintos paneles
	 * @param pPrincipal: es el contenedor padre
	 * @param login: pantalla de login
	 */
	public ClientesInterfaz(JPanel pCentral, JPanel pIzquierdo,
			JPanel pPrincipal, Login login) {

		this.login = login;
		panelCentral = pCentral;
		panelIzquierdo = pIzquierdo;

		panelCentral.removeAll();
		panelIzquierdo.removeAll();

		mostrarPanelCentralGestion();
		mostrarPanelIzquierdo();

		panelCentral.updateUI();
		panelIzquierdo.updateUI();
		panelPrincipal = pPrincipal;

		btnCambioUsuario.addActionListener(this);
		btnGuardar.addActionListener(this);
		btnFecha.addActionListener(this);
		btnAlta.addActionListener(this);
		btnLimpiar.addActionListener(this);
		btnModif.addActionListener(this);
		btnBaja.addActionListener(this);
		btnReset.addActionListener(this);

	}
	
	/**
	 * Método que se encarga de mostrar nuestro panel de gestión con sus respectivos campos y botones
	 * Hace la llamada al método visualizarTabla();
	 */

	public void mostrarPanelCentralGestion() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)),
				"GESTIÓN CLIENTES",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbDni_.setBounds(new Rectangle(75, 50, 140, 20));
		txtDni.setBounds(new Rectangle(220, 50, 80, 20));
		lbTlf_.setBounds(new Rectangle(75, 75, 140, 20));
		txtTlf.setBounds(new Rectangle(220, 75, 80, 20));
		lbNombre_.setBounds(new Rectangle(75, 100, 120, 20));
		txtNombre.setBounds(new Rectangle(220, 100, 200, 20));
		lbApellidos_.setBounds(new Rectangle(75, 125, 120, 20));
		txtApellidos.setBounds(new Rectangle(220, 125, 200, 20));

		panelCentral.add(lbDni_);
		panelCentral.add(txtDni);
		panelCentral.add(lbTlf_);
		panelCentral.add(txtTlf);
		panelCentral.add(lbNombre_);
		panelCentral.add(txtNombre);
		panelCentral.add(lbApellidos_);
		panelCentral.add(txtApellidos);

		// Se añaden los escuchadores
		txtDni.addKeyListener(this);
		txtTlf.addKeyListener(this);
		txtNombre.addKeyListener(this);
		txtApellidos.addKeyListener(this);

		// Se añade la tabla con todos los registros. Dentro de este método
		// actualizamos los cambios del panelCentral
		// con
		panelCentral.updateUI();
		visualizarTabla();
	}
	
	/**
	 * Método que se encarga de mostrar el panel de alta con sus respectivos campos
	 * Hace la llamada al método añadeBotones();
	 */
	public void mostrarPanelCentralAlta() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "ALTA CLIENTES",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		// lbId.setBounds(new Rectangle(75, 50, 50, 20));
		// txtId.setBounds(new Rectangle(220, 50, 50, 20));
		lbDni.setBounds(new Rectangle(75, 50, 140, 20));
		txtDni.setBounds(new Rectangle(220, 50, 80, 20));
		lbNombre.setBounds(new Rectangle(75, 75, 120, 20));
		txtNombre.setBounds(new Rectangle(220, 75, 125, 20));
		lbNacimiento.setBounds(new Rectangle(75, 100, 125, 20));
		txtNacimiento.setBounds(new Rectangle(220, 100, 125, 20));
		lbCalle.setBounds(new Rectangle(75, 125, 125, 20));
		txtCalle.setBounds(new Rectangle(220, 125, 125, 20));
		lbSocio.setBounds(new Rectangle(75, 150, 50, 20));
		txtSocio.setBounds(new Rectangle(220, 150, 50, 20));

		txtSocio.removeAllItems();
		txtSocio.addItem("Si");
		txtSocio.addItem("No");
		if (esSocio) {
			txtSocio.setSelectedIndex(0);
		} else {
			txtSocio.setSelectedIndex(1);
		}

		lbPagado.setBounds(new Rectangle(75, 175, 75, 20));
		txtPagado.setBounds(new Rectangle(220, 175, 50, 20));
		txtPagado.removeAllItems();
		txtPagado.addItem("Si");
		txtPagado.addItem("No");
		if (pagado) {
			txtPagado.setSelectedIndex(0);
		} else {
			txtPagado.setSelectedIndex(1);
		}

		lbnumCuenta.setBounds(new Rectangle(75, 200, 125, 20));
		txtnumCuenta.setBounds(new Rectangle(220, 200, 125, 20));

		lbTlf.setBounds(new Rectangle(500, 50, 140, 20));
		txtTlf.setBounds(new Rectangle(645, 50, 80, 20));
		lbApellidos.setBounds(new Rectangle(500, 75, 120, 20));
		txtApellidos.setBounds(new Rectangle(645, 75, 200, 20));
		lbSexo.setBounds(new Rectangle(500, 100, 50, 20));
		txtSexo.setBounds(new Rectangle(645, 100, 100, 20));

		lbMail.setBounds(new Rectangle(500, 125, 100, 20));
		txtMail.setBounds(new Rectangle(645, 125, 200, 20));
		lbpasswd.setBounds(new Rectangle(500, 150, 100, 20));
		txtPasswd.setBounds(new Rectangle(645, 150, 100, 20));
		txtSexo.removeAllItems();
		txtSexo.addItem("Hombre");
		txtSexo.addItem("Mujer");
		if (sexo) {
			txtSexo.setSelectedIndex(0);
		} else {
			txtSexo.setSelectedIndex(1);
		}

		panelCentral.add(lbDni);
		panelCentral.add(txtDni);
		panelCentral.add(lbTlf);
		panelCentral.add(txtTlf);
		panelCentral.add(lbNombre);
		panelCentral.add(txtNombre);
		panelCentral.add(lbApellidos);
		panelCentral.add(txtApellidos);
		panelCentral.add(lbSocio);
		panelCentral.add(txtSocio);
		panelCentral.add(lbSocio);
		panelCentral.add(txtSocio);
		panelCentral.add(lbpasswd);
		panelCentral.add(txtPasswd);
		panelCentral.add(lbMail);
		panelCentral.add(txtMail);
		panelCentral.add(lbNacimiento);
		panelCentral.add(txtNacimiento);
		panelCentral.add(lbCalle);
		panelCentral.add(txtCalle);
		panelCentral.add(lbPagado);
		panelCentral.add(txtPagado);
		panelCentral.add(lbSexo);
		panelCentral.add(txtSexo);
		panelCentral.add(lbnumCuenta);
		panelCentral.add(txtnumCuenta);

		// Se añaden los escuchadores

		txtDni.addKeyListener(this);
		txtTlf.addKeyListener(this);
		txtNombre.addKeyListener(this);
		txtApellidos.addKeyListener(this);
		txtSocio.addKeyListener(this);
		txtPasswd.addKeyListener(this);
		txtMail.addKeyListener(this);
		txtNacimiento.addKeyListener(this);
		txtCalle.addKeyListener(this);
		txtPagado.addKeyListener(this);
		txtSexo.addKeyListener(this);
		// actualizamos los cambios del panelCentral

		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();

		anadeBotones();
	}
	
/**
 * Método que limpia todos los campos
 */
	public void limpiarJTextFields() {
		txtDni.setText("");
		txtTlf.setText("");
		txtNombre.setText("");
		txtApellidos.setText("");
		txtPasswd.setText("");
		txtMail.setText("");
		txtTlf.setText("");
		txtCalle.setText("");
		txtnumCuenta.setText("");
		txtNacimiento.setText("");

	}
	
	/**
	 * Método que se encarga de mostrar el panel de modificar con sus respectivos campos
	 * y botones
	 */
	public void mostrarPanelCentralModificar() {

		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)),
				"MODIFICAR DATOS CLIENTE",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		/*
		 * Los componentes pueden colocarse exactamente donde el programador lo
		 * decida si en lugar de usar uno de los layouts predeterminados aplica
		 * el Layout null (setLayout(null)) y define la posición y dimensiones
		 * de cada componente con el método setBounds(int left,int top,int
		 * width,int height) de la clase Component. Este sistema tiene el
		 * inconveniente de que la presentación no se ajusta automáticamante
		 * cuando se cambian las dimensiones del contenedor o la ventana, pero
		 * en muchas ocasiones es útil y además cuando el programador quiere
		 * controlar todos los detalles no hay mejor opción.
		 */
		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbDni.setBounds(new Rectangle(75, 50, 140, 20));
		txtDni.setBounds(new Rectangle(220, 50, 80, 20));
		txtDni.setText(cliente.getDni());
		lbNombre.setBounds(new Rectangle(75, 75, 120, 20));
		txtNombre.setBounds(new Rectangle(220, 75, 125, 20));
		txtNombre.setText(cliente.getNombre());
		lbNacimiento.setBounds(new Rectangle(75, 100, 125, 20));
		txtNacimiento.setBounds(new Rectangle(220, 100, 125, 20));

		txtNacimiento.setText(cliente.getNacimiento().getDay() + "/"
				+ (cliente.getNacimiento().getMonth() + 1) + "/"
				+ (1900 + cliente.getNacimiento().getYear()));

		lbCalle.setBounds(new Rectangle(75, 125, 125, 20));
		txtCalle.setBounds(new Rectangle(220, 125, 125, 20));
		txtCalle.setText(cliente.getCalle());
		lbSocio.setBounds(new Rectangle(75, 150, 50, 20));
		txtSocio.setBounds(new Rectangle(220, 150, 50, 20));
		txtSocio.removeAllItems();
		txtSocio.addItem("Si");
		txtSocio.addItem("No");
		if (esSocio) {
			txtSocio.setSelectedIndex(0);
		} else {
			txtSocio.setSelectedIndex(1);
		}

		lbPagado.setBounds(new Rectangle(75, 175, 75, 20));
		txtPagado.setBounds(new Rectangle(220, 175, 50, 20));
		txtPagado.removeAllItems();
		txtPagado.addItem("Si");
		txtPagado.addItem("No");

		if (pagado) {
			txtPagado.setSelectedIndex(0);
		} else {
			txtPagado.setSelectedIndex(1);
		}

		lbnumCuenta.setBounds(new Rectangle(75, 200, 125, 20));
		txtnumCuenta.setBounds(new Rectangle(220, 200, 125, 20));
		txtnumCuenta.setText(cliente.getNumeroCuenta());
		lbTlf.setBounds(new Rectangle(500, 50, 140, 20));
		txtTlf.setBounds(new Rectangle(645, 50, 80, 20));
		txtTlf.setText(cliente.getTelefono());
		lbApellidos.setBounds(new Rectangle(500, 75, 120, 20));
		txtApellidos.setBounds(new Rectangle(645, 75, 200, 20));
		txtApellidos.setText(cliente.getApellido());
		lbSexo.setBounds(new Rectangle(500, 100, 50, 20));
		txtSexo.setBounds(new Rectangle(645, 100, 100, 20));
		txtSexo.removeAllItems();
		txtSexo.addItem("Hombre");
		txtSexo.addItem("Mujer");

		if (sexo) {
			txtSexo.setSelectedIndex(0);
		} else {
			txtSexo.setSelectedIndex(1);
		}

		lbMail.setBounds(new Rectangle(500, 125, 100, 20));
		txtMail.setBounds(new Rectangle(645, 125, 200, 20));
		txtMail.setText(cliente.getMail());
		lbpasswd.setBounds(new Rectangle(500, 150, 100, 20));
		txtPasswd.setBounds(new Rectangle(645, 150, 100, 20));
		txtPasswd.setText(cliente.getPass());

		panelCentral.add(lbDni);
		panelCentral.add(txtDni);
		panelCentral.add(lbTlf);
		panelCentral.add(txtTlf);
		panelCentral.add(lbNombre);
		panelCentral.add(txtNombre);
		panelCentral.add(lbApellidos);
		panelCentral.add(txtApellidos);
		panelCentral.add(lbSocio);
		panelCentral.add(txtSocio);
		panelCentral.add(lbSocio);
		panelCentral.add(txtSocio);
		panelCentral.add(lbpasswd);
		panelCentral.add(txtPasswd);
		panelCentral.add(lbMail);
		panelCentral.add(txtMail);
		panelCentral.add(lbNacimiento);
		panelCentral.add(txtNacimiento);
		panelCentral.add(lbCalle);
		panelCentral.add(txtCalle);
		panelCentral.add(lbPagado);
		panelCentral.add(txtPagado);
		panelCentral.add(lbSexo);
		panelCentral.add(txtSexo);
		panelCentral.add(lbnumCuenta);
		panelCentral.add(txtnumCuenta);

		// Se añaden los escuchadores

		txtDni.addKeyListener(this);
		txtTlf.addKeyListener(this);
		txtNombre.addKeyListener(this);
		txtApellidos.addKeyListener(this);
		txtSocio.addKeyListener(this);
		txtPasswd.addKeyListener(this);
		txtMail.addKeyListener(this);
		txtNacimiento.addKeyListener(this);
		txtCalle.addKeyListener(this);
		txtPagado.addKeyListener(this);
		txtSexo.addKeyListener(this);
		// actualizamos los cambios del panelCentral

		// Actualizamos el panelCentr
		// actualizamos los cambios del panelCentral

		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();

		// Se añaden los botones Alta y Limpiar
		btnGuardar.setBounds(new Rectangle(375, 300, 130, 30));
		panelCentral.add(btnGuardar);
		btnReset.setBounds(new Rectangle(525, 300, 130, 30));
		panelCentral.add(btnReset);
		btnFecha.setBounds(new Rectangle(350, 100, 135, 20));
		panelCentral.add(btnFecha);
		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();
	}
	
	/**
	 * Método que se encarga de mostrar el panel izquierdo con sus respectivos paneles
	 * y boton de cambio de usuario
	 */
	public void mostrarPanelIzquierdo() {

		// Pone un borde y un título al panel
		panelIzquierdo.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "MÓDULO CLIENTES",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		// Zona rígida (RigidArea): proporciona un área invisible de separación
		// horizontal y
		// vertical. En una caja horizontal, la separación vertical afectará a
		// todos sus
		// componentes y viceversa.
		Box caja = Box.createVerticalBox();

		// Se ponen las opciones disponibles para el módulo gestión de empleados
		// como etiquetas.
		lbGestionClientes = new JLabel("Gestión Clientes");
		// Se cambia el color de la etiqueta que va estar seleccionada por
		// defecto a un azul fuerte.
		lbGestionClientes.setForeground(new Color(0, 0, 128));
		// Se añade a la zona rígida.
		caja.add(lbGestionClientes);
		caja.add(Box.createRigidArea(new Dimension(40, 15)));

		lbAltaClientes = new JLabel("Alta Cliente");
		caja.add(lbAltaClientes);
		// caja.add(Box.createRigidArea(new Dimension(50, 30)));

		// Se añaden los escuchadores de los JLabels
		lbGestionClientes.addMouseListener(this);
		lbAltaClientes.addMouseListener(this);

		// Se aaden las restricciones a la fila 0, columna 0
		GridBagConstraints constraintsCaja = new GridBagConstraints();
		constraintsCaja.anchor = GridBagConstraints.NORTHWEST;
		constraintsCaja.gridx = 0; // El rea de texto empieza en la columna
									// cero.
		constraintsCaja.gridy = 0; // El rea de texto empieza en la fila cero
		constraintsCaja.insets = new Insets(0, 0, 345, 0);

		// Se aade la caja con sus restricciones al panelIzquierdo
		panelIzquierdo.add(caja, constraintsCaja);

		// Se aaden las restricciones a la fila 1, columna 0
		GridBagConstraints constraintsCambioUsuario = new GridBagConstraints();
		constraintsCambioUsuario.gridx = 0; // El rea de texto empieza en la
											// columna cero.
		constraintsCambioUsuario.gridy = 1; // El rea de texto empieza en la
											// fila cero

		// Se aade el botn cambio de usuario con sus restricciones al
		// panelIzquierdo
		panelIzquierdo.add(btnCambioUsuario, constraintsCambioUsuario);

		// panelIzquierdo.add(caja);
	}
	

	/**
	 * Método que genera la tabla
	 */
	public void visualizarTabla() {

		Clientes cliente; // Utilizado para guardar los datos que vamos
							// extrayendo de la consulta

		// Borramos si hubiese alguna otra tabla, para poderla actualizar a la
		// actual
		if (scrollPanel != null) {
			panelCentral.remove(scrollPanel);
		}

		// Abrimos una sesión en Hibernate para poder realizar la consulta
		Session sesion = HibernateUtil.getSession();
		// Obtenemos todos los empleados de la tabla empleados de la Base de
		// datos del proyecto.

		List<Clientes> lista = new ClientesDAOImpl(sesion).findAll();

		Iterator<Clientes> iter = lista.iterator();

		modelo = new ModeloTabla();
		table = new JTable(modelo);

		// Añadimos los títulos de las columnas de la tabla
		modelo.addColumn("Dni");
		modelo.addColumn("Nombre");
		modelo.addColumn("Apellidos");
		modelo.addColumn("Socio");
		modelo.addColumn("Passwd");
		modelo.addColumn("Email");
		modelo.addColumn("Teléfono");
		modelo.addColumn("Calle");
		modelo.addColumn("Pagado");
		modelo.addColumn("Util");
		modelo.addColumn("NumCuenta");
		modelo.addColumn("Nacimiento");
		modelo.addColumn("Sexo");

		try {
			
		
		// Declaramos una fila con 7 columnas. Estas 7 columnas componen cada
		// fila de nuestra tabla de búsquedas.
		String[] fila = new String[13];
		// Recorremos el Iterador mientras hayan elementos
		while (iter.hasNext()) {
			// Extraemos el objeto del Iterador obtenido de la lista de
			// resultados de la consulta realizada con Hibernate a la
			// base de datos.
			cliente = (Clientes) iter.next();
			dniDel.add(cliente);
			// Extraemos los datos de cada columna
			fila[0] = cliente.getDni();
			fila[1] = cliente.getNombre();
			fila[2] = cliente.getApellido();
			boolean tmp = cliente.isSocio();
			if (tmp) {
				fila[3] = "Si";
			} else {
				fila[3] = "No";
			}
			fila[4] = cliente.getPass();
			fila[5] = cliente.getMail();
			fila[6] = cliente.getTelefono();
			fila[7] = cliente.getCalle();
			String tmp2 = "No";
			if (cliente.getPagado() == true) {
				tmp2 = "Si";
			}
			fila[8] = tmp2;
			boolean tmp3 = cliente.getUtil();
			if (tmp3) {
				fila[9] = "Si";
			} else {
				fila[9] = "No";
			}
			fila[10] = cliente.getNumeroCuenta();
			fila[11] = cliente.getNacimiento().getDay() + "/"
					+ (cliente.getNacimiento().getMonth() + 1) + "/"
					+ (cliente.getNacimiento().getYear() + 1900);

			String tmp4 = "";
			if (cliente.getSexo() == true) {
				tmp4 = "Hombre";
			} else {
				tmp4 = "Mujer";
			}
			fila[12] = tmp4;

			modelo.addRow(fila); // Añade una fila al final de la tabla
		
		}

		} catch (Exception e) {
			// TODO: handle exception
		}
		
		elQueOrdena = new TableRowSorter<ModeloTabla>(modelo);
		table.setRowSorter(elQueOrdena);

		// Hacemos que sólo se pueda seleccionar una fila de la tabla
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		// Bloqueamos que las columnas de la tabla se pueden deslizar y cambiar
		// de posicion con el movimiento del mouse
		table.getTableHeader().setReorderingAllowed(false);

		// Le añadimos un scroll a la tabla
		scrollPanel = new JScrollPane(table);
		scrollPanel.setBounds(new Rectangle(75, 200, 1000, 150));
		panelCentral.add(scrollPanel);

		// Se añaden los botones Modificar, Baja y Limpiar
		btnModif.setBounds(new Rectangle(330, 400, 130, 30));
		btnBaja.setBounds(new Rectangle(480, 400, 130, 30));
		btnLimpiar.setBounds(new Rectangle(630, 400, 130, 30));
		panelCentral.add(btnModif);
		panelCentral.add(btnBaja);
		panelCentral.add(btnLimpiar);
		table.addMouseListener(this);
		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		HibernateUtil.closeSession();
	}
	
	/**
	 * Método que añade los botones
	 */
	public void anadeBotones() {

		// Se añaden los botones Modificar, Baja y Limpiar
		btnAlta.setBounds(new Rectangle(375, 300, 130, 30));
		panelCentral.add(btnAlta);
		btnLimpiar.setBounds(new Rectangle(525, 300, 130, 30));
		panelCentral.add(btnLimpiar);
		btnFecha.setBounds(new Rectangle(350, 100, 135, 20));
		panelCentral.add(btnFecha);

		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		// HibernateUtil.closeSession();
	}
	
	/**
	 * Método que se encarga de validar si es un email
	 * @param email Recibe como parámetro el email que vamos a pasarle
	 * @return true si es un email correcto y false si es incorrecto
	 */
	public boolean validaEmail(String email) {
		String EMAIL_REGEX = "^[\\w-_\\.+]*[\\w-_\\.]\\@([\\w]+\\.)+[\\w]+[\\w]$";
		return email.matches(EMAIL_REGEX);
	}
	
	/**
	 * Método que se encarga de validar si es un dni
	 * @param string Recibe como parámetro el dni que vamos a pasarle
	 * @return true si es un dni correcto y false si es incorrecto
	 */

	public static boolean isNumeric(String string) {
		if (string.length() == 8) {
			return string.matches("^[-+]?\\d+(\\.\\d+)?$");
		} else {
			return false;
		}
	}
	
	/**
	 * Método que se encarga de realizar una acción determinada cuando se pulsa
	 * cualquier componente de la interfaz
	 */
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == btnAlta) { // Se pulsa el botón Alta
			if (validaEmail(txtMail.getText())) {
				if (isNumeric(txtDni.getText().substring(0,
						txtDni.getText().length() - 1))) {
					try {

						cliente.setDni(txtDni.getText());
						cliente.setNombre(txtNombre.getText());
						cliente.setApellido(txtApellidos.getText());

						String tmp = txtSocio.getSelectedItem().toString();
						boolean tmp1 = false;
						if (tmp == "No") {
							tmp1 = false;
						} else if (tmp == "Si"){
							tmp1 = true;
						}

						cliente.setSocio(tmp1);
						cliente.setPass(txtPasswd.getText());
						cliente.setMail(txtMail.getText());
						cliente.setTelefono(txtTlf.getText());
						cliente.setCalle(txtCalle.getText());
						String tmp2 = txtPagado.getSelectedItem().toString();
						boolean tmp3 = false;
						if (tmp2 == "No") {
							tmp3 = false;
						} else if (tmp2 == "Si") {
							tmp3 = true;
						}
						cliente.setPagado(tmp3);
						cliente.setUtil(true);
						cliente.setNumeroCuenta(txtnumCuenta.getText());

						Date fecha = new Date();
						String[] date = txtNacimiento.getText().split("/");
						fecha.setDate(Integer.parseInt(date[0]));
						fecha.setMonth(Integer.parseInt(date[1]) - 1);
						fecha.setYear(Integer.parseInt(date[2]) - 1900);
						cliente.setNacimiento(fecha);
						String tmp4 = txtSexo.getSelectedItem().toString();
						boolean tmp5 = false;
						if (tmp4 == "Mujer") {
							tmp5 = false;
						} else if (tmp4 == "Hombre") {
							tmp5 = true;
						}
						cliente.setSexo(tmp5);
						Session sesion = HibernateUtil.getSession();
						HibernateUtil.beginTransaction();
						boolean clie = new ClientesDAOImpl(sesion)
								.guardarCliente(cliente.getDni(), sesion,
										cliente);
						HibernateUtil.endTransaction();
						// HibernateUtil.closeSession();
						JOptionPane
								.showMessageDialog(null, "Cliente insertado");
					} catch (Exception e2) {
						JOptionPane.showMessageDialog(null, e2.getMessage());
					}
				} else {
					JOptionPane.showMessageDialog(null, "DNI incorrecto");
				}
			} else {
				JOptionPane.showMessageDialog(null, "Email incorrecto");
			}

		}

		if (e.getSource() == btnModif) { // Se pulsa el botón Modificar
			mostrarPanelCentralModificar();
		}

		if (e.getSource() == btnBaja) { // Se pulsa el botón Baja

			int seleccion = JOptionPane.showConfirmDialog(this,
					"¿Confirma que quiere borrar el registro con dni "
							+ cliente.getDni() + "?", "Baja de cliente",
					JOptionPane.YES_NO_OPTION);
			if (seleccion == JOptionPane.YES_OPTION) {
				try {
					Session sesion = HibernateUtil.getSession();
					HibernateUtil.beginTransaction();
					new ClientesDAOImpl(sesion).borrarCliente(cliente.getDni());

					HibernateUtil.endTransaction();
					//HibernateUtil.closeSession();

				} catch (Exception e3) {
					JOptionPane.showMessageDialog(null,
							"Cliente no registrado. No se puede dar de baja");
					HibernateUtil.deshacerTransaccion();
				}
				modelo.removeRow(fila);
				table.updateUI();
				limpiarJTextFields();

				JOptionPane.showMessageDialog(null, "El cliente con dni "
						+ cliente.getDni() + " ha sido borrado.");
				mostrarPanelCentralGestion();
			} else if (seleccion == JOptionPane.NO_OPTION) {
				JOptionPane.showMessageDialog(null,
						"La operación ha sido cancelada");
			}

		}

		if (e.getSource() == btnLimpiar) { // Se pulsa el botón Limpiar
			// Muestra todos los registros de la tabla. Se han quitado los
			// filtros
			elQueOrdena.setRowFilter(null);
			// Inicializamos las variables de los JtextFields
			limpiarJTextFields();
		}

		if (e.getSource() == btnCambioUsuario) { // Se
			// pulsa
			// el
			// botn
			// Cambio
			// de
			// Usuario
			int seleccion = JOptionPane.showConfirmDialog(this,
					"Desea realmente cambiar de usuario?",
					"Cambio de usuario", JOptionPane.YES_NO_OPTION);
			if (seleccion == JOptionPane.YES_OPTION) {
				// Se llama al objeto Login para que vuelva cargar el login de
				// la aplicacin a travs del mtodo iniciar
				login.iniciar(panelPrincipal);
			}
		}

		if (e.getSource() == btnReset) { // Se pulsa el
											// botón Reset
											// en la
											// pantalla
											// modificación
											// datos
											// clientes
			mostrarPanelCentralModificar();
		}

		if (e.getSource() == btnGuardar) { // Se pulsa el botón Guardar
											// en la pantalla
											// modificación datos
											// empleado
			/*- En la linea 1 se puede observar que cree una variable entera, el null que se antepone al mensaje es necesario, ya que este se toma cuando el usuario pulsa la tecla Esc o presiona Cancelar, el mensaje a mostrar se usa como en los anteriores cuadros de dialogo.
			- En las lineas 2 y 4 se usan condicionales para tomar las acciones respectivas de acuerdo a la opción que haya dado el usuario.
			- En las lineas 3 y 5 se muestran mensaje correspondientes a la respectiva opción que haya dado el usuario.*/
			
			int seleccion = JOptionPane.showConfirmDialog(this,
					"¿Confirma que quiere modificar el cliente con dni "
							+ cliente.getDni() + "?", "Guardar cliente",
					JOptionPane.YES_NO_OPTION);
			if (seleccion == JOptionPane.YES_OPTION) {
				try {
					cliente.setNombre(txtNombre.getText());
					cliente.setApellido(txtApellidos.getText());
					String tmp3 = txtSocio.getSelectedItem().toString();
					boolean tmp6 = false;
					if(tmp3 == "Si"){
						tmp6 = true;
					} else if(tmp3 == "No"){
						tmp6 = false;
					}
					cliente.setSocio(tmp6);
					cliente.setPass(txtPasswd.getText());
					cliente.setMail(txtMail.getText());
					cliente.setTelefono(txtTlf.getText());
					cliente.setCalle(txtCalle.getText());
					String tmp7 = txtSocio.getSelectedItem().toString();
					boolean tmp8 = false;
					if(tmp7 == "Si"){
						tmp8 = true;
					} else if(tmp7 == "No"){
						tmp8 = false;
					}
					cliente.setSocio(tmp8);
					cliente.setNumeroCuenta(txtnumCuenta.getText());
					Date fecha = new Date();
					String[] date = txtNacimiento.getText().split("/");

					fecha.setDate(Integer.parseInt(date[0]));
					fecha.setMonth(Integer.parseInt(date[1])-1);
					fecha.setYear(Integer.parseInt(date[2])-1900);
					cliente.setNacimiento(fecha);
					String tmp4 = txtSexo.getSelectedItem().toString();
					boolean tmp5 = false;
					if (tmp4 == "Mujer") {
						tmp5 = false;
					} else if (tmp4 == "Hombre") {
						tmp5 = true;
					}
					cliente.setSexo(tmp5);

					Session sesion = HibernateUtil.getSession();
					// Se inicia la transacción de modificación del empleado
					HibernateUtil.beginTransaction();
					// Se realiza la modificación
					new ClientesDAOImpl(sesion).modificarCliente(cliente);
					// Se cierra la transacción
					HibernateUtil.endTransaction();
					// Se cierra la sesión
					HibernateUtil.closeSession();

				} catch (Exception e2) {
					JOptionPane.showMessageDialog(null,
							"Cliente no registrado. No se puede modificar.");
				}
				JOptionPane.showMessageDialog(null, "El cliente con dni "
						+ cliente.getDni() + " ha sido modificado.");
				// Se vuelve a mostrar el panel central de Gestión
				mostrarPanelCentralGestion();
			} else {
				// JOptionPane.showMessageDialog(null,
				// "La operación ha sido cancelada");
				JOptionPane.showMessageDialog(null,
						"La operación ha sido cancelada");
				// Se vuelve a mostrar el panel central de Gestión
				mostrarPanelCentralGestion();
			}
		}

		if (e.getSource() == btnFecha) {
			JFrame frame = new JFrame("Calendario");
			frame.getContentPane().add(new calendar(), BorderLayout.CENTER);
			frame.setSize(600, 300);
			frame.setVisible(true);
		}
	}
	
	/**
	 * Clase que instancia el calendario
	 * @author Alverto
	 *
	 */
	class calendar extends JPanel {
		JCalendar cal;

		public calendar() {
			setLayout(new BorderLayout());
			cal = new JCalendar();
			add(cal, BorderLayout.CENTER);

			cal.addDateListener(new DateListener() {

				@Override
				public void dateChanged(DateEvent arg0) {
					txtNacimiento.setText(cal.getDate().getDay() + "/"
							+ (cal.getDate().getMonth() + 1) + "/"
							+ (cal.getDate().getYear() + 1900));

				}
			});
		}
	}
	
	/**
	 * Método que se encarga de realizar una acción determinada cuando se pulsa
	 * cualquier componente de la interfaz
	 */
	public void mouseClicked(MouseEvent e) {
		if (e.getSource() == lbGestionClientes) { // Se pulsa la etiqueta del
													// panel Izquierdo Gestión
													// de empleados
			new ClientesInterfaz(panelCentral, panelIzquierdo, panelPrincipal, login);
			
		}
		if (e.getSource() == lbAltaClientes) { // Se pulsa la etiqueta del panel
												// Izquierdo Alta de empleados
			mostrarPanelCentralAlta();
			// Se cambia el color de la etiqueta Alta de empleados a un azul
			// fuerte.
			lbAltaClientes.setForeground(new Color(0, 0, 128));
			// Se cambia el color de la etiqueta Alta de empleados a negro.
			lbGestionClientes.setForeground(new Color(0, 0, 0));
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}
	
	@Override
	public void mouseReleased(MouseEvent e) {

		if (e.getSource() == table) {
			JTable tablaAuxiliar = table;
			tablaAuxiliar.updateUI();
			int fila = table.rowAtPoint(e.getPoint());

			if ((fila > -1)) {
				dni = tablaAuxiliar.getValueAt(fila, 0).toString();
				txtDni.setText(dni);
				if (tablaAuxiliar.getValueAt(fila, 1) == null) {
					nombre = "";
				} else {
					nombre = tablaAuxiliar.getValueAt(fila, 1).toString();
				}
				if (tablaAuxiliar.getValueAt(fila, 2) == null) {
					apellido = "";
				} else {
					apellido = tablaAuxiliar.getValueAt(fila, 2).toString();
				}
				if (tablaAuxiliar.getValueAt(fila, 3).equals("Si")) {
					esSocio = true;
				} else {
					esSocio = false;
				}
				if (tablaAuxiliar.getValueAt(fila, 4) == null) {
					passwd = "";
				} else {
					passwd = tablaAuxiliar.getValueAt(fila, 4).toString();
				}
				if (tablaAuxiliar.getValueAt(fila, 5) == null) {
					mail = "";
				} else {
					mail = tablaAuxiliar.getValueAt(fila, 5).toString();
					if (tablaAuxiliar.getValueAt(fila, 6) == null) {
						tlf = "";
					} else {
						tlf = tablaAuxiliar.getValueAt(fila, 6).toString();
					}
					if (tablaAuxiliar.getValueAt(fila, 7) == null) {
						calle = "";
					} else {
						calle = tablaAuxiliar.getValueAt(fila, 7).toString();
					}
					if (tablaAuxiliar.getValueAt(fila, 8).equals("Si")) {
						pagado = true;
					} else {
						pagado = false;
					}
					if (tablaAuxiliar.getValueAt(fila, 9).equals("Si")) {
						util = true;
					} else {
						util = false;
					}
					if (tablaAuxiliar.getValueAt(fila, 10) == null) {
						numcuenta = "";
					} else {
						numcuenta = tablaAuxiliar.getValueAt(fila, 10)
								.toString();
					}
					if (tablaAuxiliar.getValueAt(fila, 11) == null) {
						nacimiento = "";
					} else {
						nacimiento = tablaAuxiliar.getValueAt(fila, 11)
								.toString();
					}
					if (tablaAuxiliar.getValueAt(fila, 12).equals("Hombre")) {
						sexo = true;
					} else {
						sexo = false;
					}

				}

				for (int x = 0; x < table.getRowCount(); x++) {
					for (int y = 0; y < dniDel.size(); y++) {
						if ((dniDel.get(y).getNombre() + " " + dniDel.get(y)
								.getApellido()).equalsIgnoreCase(table
								.getValueAt(x, 1)
								+ " "
								+ table.getValueAt(x, 2))) {
							dniDel2.add(dniDel.get(y));
						}
					}
				}
				
				cliente = dniDel2.get(fila);
				esSocio = cliente.isSocio();
				pagado = cliente.getPagado();
				sexo = cliente.getSexo();
			}
		}
	}

	public void keyReleased(KeyEvent e) {

		// Extraemos los datos de los JTextField
		String dni = txtDni.getText();
		String tlf = txtTlf.getText();
		String nombre = txtNombre.getText();
		String apellidos = txtApellidos.getText();

		// Suponemos que en dni y tlf no van a haber acentos
		// Hacemos que nombre sea insensible a acentos
		nombre = nombre.replace("a", "(a|á|A|Á)");
		nombre = nombre.replace("e", "(e|é|E|É)");
		nombre = nombre.replace("i", "(i|í|I|Í)");
		nombre = nombre.replace("o", "(o|ó|O|Ó)");
		nombre = nombre.replace("u", "(u|ú|U|Ú)");
		nombre = nombre.replace("A", "(a|á|A|Á)");
		nombre = nombre.replace("E", "(e|é|E|É)");
		nombre = nombre.replace("I", "(i|í|I|Í)");
		nombre = nombre.replace("O", "(o|ó|O|Ó)");
		nombre = nombre.replace("U", "(u|ú|U|Ú)");

		// Hacemos que apellidos sea insensible a acentos
		apellidos = apellidos.replace("a", "(a|á|A|Á)");
		apellidos = apellidos.replace("e", "(e|é|E|É)");
		apellidos = apellidos.replace("i", "(i|í|I|Í)");
		apellidos = apellidos.replace("o", "(o|ó|O|Ó)");
		apellidos = apellidos.replace("u", "(u|ú|U|Ú)");
		apellidos = apellidos.replace("A", "(a|á|A|Á)");
		apellidos = apellidos.replace("E", "(e|é|E|É)");
		apellidos = apellidos.replace("I", "(i|í|I|Í)");
		apellidos = apellidos.replace("O", "(o|ó|O|Ó)");
		apellidos = apellidos.replace("U", "(u|ú|U|Ú)");

		// Establecemos los filtros.
		if (dni.equals("")) {
			if (tlf.equals("")) {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						// Muestra todos los registros. Se han quitado los
						// filtros
						elQueOrdena.setRowFilter(null);
					} else {
						/*------------------------------FILTRA POR APELLIDOS--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ apellidos + ".*", 2));
					}
				} else {
					if (apellidos.equals("")) {
						/*------------------------------FILTRA POR NOMBRE--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ nombre + ".*", 1));
					} else {
						/*-------------------------FILTRA POR NOMBRE Y APELLIDOS----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			} else {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						/*------------------------------FILTRA POR TELÉFONO--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ tlf + ".*", 3));
					} else {
						/*-------------------------FILTRA POR TELÉFONO Y APELLIDOS----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				} else {
					if (apellidos.equals("")) {
						/*-------------------------FILTRA POR TELÉFONO Y NOMBRE----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*----------------------FILTRA POR TELÉFONO, NOMBRE Y APELLIDOS------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			}
		} else {
			if (tlf.equals("")) {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						/*------------------------------FILTRA POR DNI--------------------------------*/
						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i)
						elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
								+ dni + ".*", 0));
					} else {
						/*-------------------------FILTRA POR DNI Y APELLIDOS----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				} else {
					if (apellidos.equals("")) {
						/*-------------------------FILTRA POR DNI Y NOMBRE----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*----------------------FILTRA POR DNI, NOMBRE Y APELLIDOS------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			} else {
				if (nombre.equals("")) {
					if (apellidos.equals("")) {
						/*-------------------------FILTRA POR DNI Y TELÉFONO----------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*----------------------FILTRA POR DNI, TELÉFONO Y APELLIDOS------------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				} else {
					if (apellidos.equals("")) {
						/*---------------------FILTRA POR DNI, TELÉFONO Y NOMBRE-----------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					} else {
						/*--------------------FILTRA POR DNI, TELÉFONO, NOMBRE Y APELLIDOS----------------------*/
						List<RowFilter<Object, Object>> lista = new ArrayList<RowFilter<Object, Object>>();

						// Hacemos que el filtro sea insensible a mayúsculas y
						// minúsculas añadiendo (?i).
						lista.add(RowFilter.regexFilter("(?i).*" + dni + ".*",
								0));
						lista.add(RowFilter.regexFilter("(?i).*" + tlf + ".*",
								3));
						lista.add(RowFilter.regexFilter("(?i).*" + nombre
								+ ".*", 1));
						lista.add(RowFilter.regexFilter("(?i).*" + apellidos
								+ ".*", 2));

						// Si hemos construido ya varios RowFilter cualesquiera
						// y los tenemos metidos en un Iterable,
						// podemos hacer operaciones lógicas and, or y not con
						// ellos
						@SuppressWarnings("rawtypes")
						RowFilter filtroAnd = RowFilter.andFilter(lista); // and
																			// de
																			// ambos
																			// filtros

						elQueOrdena.setRowFilter(filtroAnd); // Establecemos el
																// filtro
					}
				}
			}
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}
